use sea_orm::{ConnectOptions, Database, DatabaseConnection};
use std::io;
use std::time::Duration;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::fmt::time::ChronoLocal;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{Layer, Registry, fmt};


/// 获取数据库连接
pub async fn get_connection() -> DatabaseConnection {
    let mut opt = ConnectOptions::new("mysql://root:root@localhost/sea-orm");
    opt.max_connections(20)
        .min_connections(5)
        .connect_timeout(Duration::from_secs(8))
        .acquire_timeout(Duration::from_secs(8))
        .idle_timeout(Duration::from_secs(8))
        .max_lifetime(Duration::from_secs(8))
        .sqlx_logging(true)
        .sqlx_logging_level(log::LevelFilter::Info);

    let db = Database::connect(opt).await.expect("数据库连接失败");
    if db.ping().await.is_ok() {
        log::info!("数据库连接成功");
    } else {
        log::error!("数据库连接失败");
        panic!("数据库连接失败");
    }
    db
}


/// 初始化日志
pub fn init_log() {
    let timer = ChronoLocal::new(String::from("%Y-%m-%d %H:%M:%S"));

    let console_layer = fmt::layer()
        // 自定义数据时间格式
        .with_timer(timer.clone())
        // 线程名
        .with_thread_names(true)
        // 输出到标准的成错误输出
        .with_writer(io::stderr)
        // 只记录INFO及以上级别的日志
        .with_filter(LevelFilter::DEBUG);

    // 输出到文件中
    //let debug_file_appender = rolling::minutely("logs", "debug.log");
    // let debug_file_appender = RollingFileAppender::builder()
    //     // 最大保留60个文件
    //     .max_log_files(60)
    //     // 一天生成一个文件
    //     .rotation(Rotation::DAILY)
    //     // 文件名前缀
    //     .filename_prefix("debug")
    //     // 文件名后缀
    //     .filename_suffix("log")
    //     // 文件所在目录
    //     .build("./logs/debug")
    //     .expect("initializing rolling file appender failed");
    //
    // let debug_file_layer = fmt::layer()
    //     .with_timer(timer.clone())
    //     .with_thread_names(true)
    //     .with_ansi(false)
    //     .with_writer(debug_file_appender)
    //     .with_filter(LevelFilter::DEBUG) // 日志级别
    //     .with_filter(filter::filter_fn(|metadata| {
    //         // 只记录log-lib::tracing_log模块下的日志
    //         // metadata.target() = "log-lib::tracing_log"
    //         // 只记录DEBUG级别的日志
    //         metadata.level() == &Level::DEBUG
    //     }));

    // 注册
    Registry::default().with(console_layer).init();
}
